﻿
#ifndef __AppTool_H__
#define __AppTool_H__

#include "CrossApp.h"

USING_NS_CC;

struct GeocodeAddress
{
	double lat;
	double lng;
	string formatAddr;
	string province;
	string city; 
	string district;
	string town;//乡镇
	string street;//社区
	string adcode;

	GeocodeAddress() :lat(0), lng(0){}
};

//兴趣点，标志性建筑、银行、医院、银行等
struct PoiInRegeocode
{
	double lat;
	double lng;
	string info;
};
struct RegeocodeInfo
{
	string formatAddr;
	string province;
	string city;
	string district;
	string town;//乡镇
	string street;//社区
	string adcode;

	std::vector<PoiInRegeocode> v_Pois;
};

struct POISearchData
{
	double lat;
	double lng;
	string province;
	string city;
	string district;
	string adcode;
	string info;

	POISearchData() :lat(0.0), lng(0.0){}
};

class AmapLocationDelegate
{
public:	

	//单次定位，有具体的地理信息
	//code为0表示成功，其他表示失败
	virtual void onOnceLocationEnd(int code, double lat, double lng, const string& formatAddr, const string& province, const string& city, const string& district, const string& street, const string& number, const string& poi, const string& adcode){};

	//持续定位，只有经纬度，没有具体的地理信息，当位置发生改变时才会有回调
	//code为0表示成功，其他表示失败
	virtual void onLocationUpdate(int code, double lat, double lng, const string& formatAddr, const string& province, const string& city, const string& district, const string& street, const string& number, const string& poi, const string& adcode){};
};

class GeocodeDelegate
{
public:

	virtual void onGetGeocodeAddress(int code, std::vector<GeocodeAddress> v_addrs){};

	virtual void onGetRegeocodeInfo(int code, RegeocodeInfo info){};
};

class PoiSearchDelegate
{
public:	
	
	virtual void onPoiKeySearchEnd(int code, std::vector<POISearchData> v_datas){};

	virtual void onPoiAroundSearch(int code, std::vector<POISearchData> v_datas){};
};

class AppTool : public CAObject
{
    
public:

	AppTool();
    
	virtual ~AppTool();
    
	static AppTool* getInstance();

	static void destroyInstance();

	CC_SYNTHESIZE(AmapLocationDelegate*, m_pAmapLocationDelegate, AmapLocationDelegate);

	CC_SYNTHESIZE(GeocodeDelegate*, m_pGeocodeDelegate, GeocodeDelegate);

	CC_SYNTHESIZE(PoiSearchDelegate*, m_pPoiSearchDelegate, PoiSearchDelegate);

	//开始单次定位
	void startOnceLocation();

	//开始持续定位
	//默认2000毫秒,小于1000毫秒时，按照1000毫秒计算
	void startLocation(int interval = 2000);

	//停止定位
	void stopLocation();

	//获取正地理编码，根据地址获取经纬度
	//addr查询的地址，cityname表示在地址所在城市，可以中文或者中文全拼，citycode、adcode
	void getGeocode(const string& addr, const string& city);

	//获取反地理编码，根据经纬度获取地址
	//lat纬度 lng纬度 radius搜索半径(单位：米)
	void getReGeocode(double lat, double lng, float radius);

	//keystr - 查询字符串，多个关键字用“ | ”分割 。
	//poitype - POI 类型的组合，比如定义如下组合：餐馆 | 电影院 | 景点 （POI类型请在网站“相关下载”处获取）。
	//city - 待查询城市（地区）的城市编码 citycode、城市名称（中文或中文全拼）、行政区划代码adcode。必设参数。传空即为全国
	void poiKeySearch(const string& keystr, const string& poitype, const string& city);

	//keystr - 查询字符串，多个关键字用“ | ”分割 。
	//poitype - POI 类型的组合，比如定义如下组合：餐馆 | 电影院 | 景点 （POI类型请在网站“相关下载”处获取）。
	//city - 待查询城市（地区）的城市编码 citycode、城市名称（中文或中文全拼）、行政区划代码adcode。必设参数。传空即为全国
	//lat lng中心点经纬度
	//round搜索范围（设置中心点经纬度）
	//city - 待查询城市（地区）的城市编码 citycode、城市名称（中文或中文全拼）、行政区划代码adcode。必设参数。传空即为全国
	void poiAroundSearch(const string& keystr, const string& poitype, double lat = -1000, double lng = -1000, int round = 1000, string city = "");
};


#endif /* defined(__HelloCpp__ViewController__) */
